perm filename OSA.MAC[11,HE] blob
sn#656311 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
.TITLE OSA
.DSABL GBL
.MCALL .EXIT,.MRKT,.QSET
.CSECT GLOBAL
G=.
.=G+2.+2.
.WORD STOP
.=G+100.+100.
.WORD MOVBLK
.WORD ZERO
.WORD 0
.WORD NOOP
.WORD SETBLK
.WORD CLLSWT
.WORD SYSERR
.WORD USC
.WORD GETFIX
.WORD FIXLFT
.CSECT
CLKPS=300
CLKCAS=177546
CLKPLS=100
DYNSIZ=6500.
STKSIZ=100.
START=G+1.+1.
BINCLK=G+135.+135.
;
;ENTRY POINT FOR ALL BCPL PROGRAMS
;
ENTRY::
CLR @#CLKCAS ;DISABLE CLOCK
MOV #CLKINT,@#CLKPLS ;CLOCK PULSE INTERRUPT
MOV #CLKPS,@#CLKPLS+2 ;
CLR BINCLK
CLR PLSCNT
MOV #100,@#CLKCAS ;ENABLE CLOCK INTERRUPT
;
;SETUP STACK
;
MOV #STKSIZ,R1 ;GET 100 WORDS FOR BCPL STACK
JSR PC,GETFIX
.WORD 0
TST R1 ;DID I GET IT?
BNE ENTOK ;YES, BRANCH
JSR PC,SYSERR ;NO, HALT
.WORD 0
ENTOK:
ASL R1 ;CONVERT POINTER TO ADDRESS
ADD #2*STKSIZ,R1 ;CALCULATE TOP OF STACK
MOV R1,R0 ;R0 = STACK POINTER
;
;EXECUTE BCPL MAIN PROGRAM
;
JSR PC,@START ;EXECUTE MAIN PROGRAM
.WORD 0
;
;EXIT POINT FOR BCPL PROGRAMS - MAIN PROGRAM RETURNS HERE
;
STOP::
.EXIT
.PAGE
;
;INTERRUPT ROUTINE ENTERED EVERY CLOCK PULSE
;
CLKINT:
INC PLSCNT ;INCREMENT PULSE COUNTER
CMP PLSCNT,#6 ;6 COUNTS = 100 MSEC
BNE NOCNT ;
CLR PLSCNT ;100 MSEC, START AGAIN
INC BINCLK ;INCREMENT BINCLK
NOCNT:
MOV #100,@#CLKCAS ;ENABLE CLOCK INTERRUPT
RTI ;RETURN FROM INTERRUPT
;
PLSCNT: .BLKW 1 ;PULSE COUNTER (1/60 SEC)
.PAGE
;
;SUBROUTINE MOVEBLOCK(DEST,SRC,COUNT)
;
MOVBLK::
ASL R1 ;CONVERT POINTERS
ASL R2 ; TO ADDRESSES
TST R3
BGT MVBLK1 ;POSITIVE CNT OK
BEQ MVBLK2 ;NO MOVE IF CNT = 0
JSR PC,CLLSWT ;NEG CNT ILLEGAL
.WORD 0
MVBLK1:
MOV (R2)+,(R1)+
SOB R3,MVBLK1
MVBLK2:
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE ZERO(DEST,COUNT)
;
ZERO::
ASL R1 ;CONVERT POINTER TO ADDRESS
TST R2
BGT ZERO1
JSR PC,CLLSWT
.WORD 0
ZERO1:
CLR (R1)+
SOB R2,ZERO1
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE NOOP()
;
NOOP::
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE SETBLOCK(DEST,VALUE,COUNT)
;
SETBLK::
ASL R1 ;CONVERT POINTER TO ADDRESS
TST R3
BGT STBLK1
JSR PC,CLLSWT
.WORD 0
STBLK1:
MOV R2,(R1)+
SOB R3,STBLK1
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE CALLSWAT()
;
CLLSWT::
HALT
;
;SUBROUTINE SYSERR()
;
SYSERR::
JSR PC,CLLSWT
.WORD 0
;
;SUBROUTINE USC(A,B) = 1/0/-1
;
USC::
CMP R1,R2
BEQ USCEQ
BHI USCHI
MOV #-1,R1
BR USCEX
USCEQ:
CLR R1
BR USCEX
USCHI:
MOV #1,R1
USCEX:
ADD #2,@SP
RTS PC ;RETURN
.PAGE
;
;SUBROUTINE GETFIXED(NWORDS) = POINTER OR 0
;
GETFIX::
MOV R1,R2 ;SAVE NWORDS
MOV SIZ,R1 ;NWORDS LEFT
CMP R1,R2 ;FEWER THAN REQUESTED?
BLO GETNO ;YES, BRANCH
MOV TOP,R1 ;NO, RETURN ADDRESS
CLC ; AS POINTER
ROR R1 ;
SUB R2,SIZ ;UPDATE SIZ
ASL R2 ;CONVERT NWORDS TO BYTES
ADD R2,TOP ;UPDATE TOP
BR GETEX
GETNO:
CLR R1 ;RETURN ZERO
GETEX:
ADD #2,@SP ;RETURN
RTS PC
;
;SUBROUTINE FIXEDLEFT() = NWORDS
;
FIXLFT::
MOV SIZ,R1 ;NWORDS LEFT
ADD #2,@SP ;RETURN
RTS PC
;
SIZ: .WORD DYNSIZ ;SIZE OF UNUSED BLOCK (WORDS)
DYN:: .BLKW DYNSIZ ;MEMORY BLOCK
TOP:: .WORD DYN ;LOC OF UNUSED BLOCK (BA)
.END ENTRY
≠(1729)